A storage controller is a physical processing device that is used to store and retrieve data on behalf of one or more hosts. A network storage controller can be configured (e.g., by hardwiring, software, firmware, or any combination thereof) to operate as a storage server that serves one or more hosts on a network, to store and manage data in a set of mass storage devices, such as magnetic, optical, and/or solid-state storage-based disks or tapes. Some storage servers are designed to service file-level requests from hosts, as is commonly the case with file servers used in a network attached storage (NAS) environment. Other storage servers are designed to service block-level requests from hosts, as with storage servers used in a storage area network (SAN) environment. Still other storage servers, e.g. unified storage servers, are capable of servicing both file-level requests and block-level requests, as is the case with certain enterprise storage servers made by NetApp®, Inc. of Sunnyvale, Calif.
In one implementation, a storage server makes data available to a client (host) system by presenting or exporting to clients one or more logical containers of data, such as volumes. A “volume” is an abstraction of physical storage, combining one or more physical mass storage devices (e.g., disks) or parts thereof into a single logical storage object, and which is managed as a single administrative unit, such as a single file system. A “file system” is a structured (e.g., hierarchical) set of stored logical containers of data (e.g., volumes, logical unit numbers (LUNs), directories, files). Note that a file system does not have to include storage that is based on “files” per se.
From the perspective of a client system, each volume can appear to be a single storage device, e.g. a disk drive. However, each volume can represent the storage space in a single physical storage device, a redundant array of independent disks (RAID) or a RAID group, an aggregate of some or all of the storage space in multiple physical storage devices, or any other suitable set of storage space. An “aggregate” is a logical aggregation of physical storage; i.e., a logical container for a pool of storage, combining one or more physical mass storage devices (e.g., disks) or parts thereof into a single logical storage object, which contains or provides storage for one or more other logical data sets at a higher level of abstraction (e.g., volumes).
A network storage system can have a very simple architecture. For example, an individual storage server can provide one or more clients on a network with access to data stored in a mass storage subsystem. As another example, two or more individual storage servers may be connected and configured as failover partners, to increase reliability, such as in a storage failover (SFO) or controller failover (CFO) configuration. Recently, however, with storage capacity demands increasing rapidly in almost every business sector, there has been a trend towards the use of clustered network storage systems.
In a clustered storage system, two or more storage server “nodes” are connected in a distributed architecture. The nodes are generally each implemented by one or more storage controllers. Each storage server node can be implemented with a modular hardware or software architecture. For example, a storage server node can be designed to include a network module (“N-module”) to provide network connectivity and a separate data module (“D-module”) to provide data storage/access functionality, where the N-module and D-module communicate with each other over a physical interconnect. Two or more such storage server nodes are typically connected to form a storage cluster.
A storage cluster may present a single system image of stored data to clients and administrators, such that the actual location of data can be made transparent to clients and administrators, i.e., clients and administrators typically do not need to be concerned about which actual node in the storage cluster stores particular data. An example of a storage controller that is designed for use in a clustered system such as this is a NetApp FAS-series filer.
Storage clusters are typically highly scaleable in comparison to non-clustered storage systems. However, despite this relative advantage over non-clustered storage systems, storage clusters still have certain problems with scaling. In particular, upward scaling in a cluster is typically achieved by adding additional storage controllers, or nodes, to the cluster. However, this is complicated by the fact that storage clusters typically require the maintenance of quorum across the storage controllers or nodes. Maintaining quorum involves ensuring that the single system image of stored data in the storage cluster is consistent across all nodes. This is computationally and network intensive, especially with a large number of nodes, because such maintenance requires replicating changes across nodes in a consistent, reliable way which typically has time complexity that linearly increases with the number of nodes. This problem hinders the ability to scale up clusters to include additional storage controllers, or nodes, which ultimately limits the performance of such clusters.